import os
import datetime
from typing import Optional

class Logger:
    """
    日志记录器类，用于生成按日期划分的日志文件，并提供日志追加功能。
    """
    
    def __init__(self, log_dir: str = "logs", log_prefix: str = "app"):
        """
        初始化日志记录器。
        
        Args:
            log_dir: 日志文件存储目录，默认为 "logs"
            log_prefix: 日志文件名前缀，默认为 "app"
        """
        self.log_dir = log_dir
        self.log_prefix = log_prefix
        
        # 确保日志目录存在
        os.makedirs(log_dir, exist_ok=True)
    
    def get_log_filename(self, date: Optional[datetime.date] = None) -> str:
        """
        根据日期获取日志文件名。
        
        Args:
            date: 日期对象，默认为当前日期
            
        Returns:
            日志文件的完整路径
        """
        if date is None:
            date = datetime.date.today()
            
        date_str = date.strftime("%Y-%m-%d")
        filename = f"{self.log_prefix}_{date_str}.log"
        return os.path.join(self.log_dir, filename)
    
    def append_log(self, message: str, level: str = "INFO", date: Optional[datetime.date] = None) -> None:
        """
        向日志文件追加日志。
        
        Args:
            message: 日志消息内容
            level: 日志级别，默认为 "INFO"
            date: 日期对象，默认为当前日期
        """
        log_file = self.get_log_filename(date)
        timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        log_entry = f"[{timestamp}] [{level}] {message}\n"
        
        with open(log_file, "a", encoding="utf-8") as f:
            f.write(log_entry)
    
    def info(self, message: str, date: Optional[datetime.date] = None) -> None:
        """
        记录 INFO 级别的日志。
        
        Args:
            message: 日志消息内容
            date: 日期对象，默认为当前日期
        """
        self.append_log(message, "INFO", date)
    
    def warning(self, message: str, date: Optional[datetime.date] = None) -> None:
        """
        记录 WARNING 级别的日志。
        
        Args:
            message: 日志消息内容
            date: 日期对象，默认为当前日期
        """
        self.append_log(message, "WARNING", date)
    
    def error(self, message: str, date: Optional[datetime.date] = None) -> None:
        """
        记录 ERROR 级别的日志。
        
        Args:
            message: 日志消息内容
            date: 日期对象，默认为当前日期
        """
        self.append_log(message, "ERROR", date)
    
    def critical(self, message: str, date: Optional[datetime.date] = None) -> None:
        """
        记录 CRITICAL 级别的日志。
        
        Args:
            message: 日志消息内容
            date: 日期对象，默认为当前日期
        """
        self.append_log(message, "CRITICAL", date)
    
    def debug(self, message: str, date: Optional[datetime.date] = None) -> None:
        """
        记录 DEBUG 级别的日志。
        
        Args:
            message: 日志消息内容
            date: 日期对象，默认为当前日期
        """
        self.append_log(message, "DEBUG", date)
    
    def clear_logs(self, days_to_keep: int = 30) -> None:
        """
        清理旧的日志文件，只保留最近指定天数的日志。
        
        Args:
            days_to_keep: 要保留的日志天数，默认为30天
        """
        today = datetime.date.today()
        cutoff_date = today - datetime.timedelta(days=days_to_keep)
        
        for filename in os.listdir(self.log_dir):
            if not filename.startswith(self.log_prefix) or not filename.endswith(".log"):
                continue
                
            try:
                # 尝试从文件名中提取日期
                date_str = filename[len(self.log_prefix) + 1:-4]  # 去掉前缀和.log后缀
                file_date = datetime.datetime.strptime(date_str, "%Y-%m-%d").date()
                
                # 如果日志文件日期早于截止日期，则删除
                if file_date < cutoff_date:
                    os.remove(os.path.join(self.log_dir, filename))
            except (ValueError, IndexError):
                # 如果文件名格式不符合预期，则跳过
                continue 